/**
 * 路由助手工具类
 * 提供跨项目路由识别和处理功能
 */
const AppError = require('./app_error.js');

class RouteHelper {
  /**
   * 解析路由，识别项目标识
   * @param {String} route 路由字符串
   * @returns {Object} 解析结果 {pid, routePath, isSystemRoute, isCrossProjectApi}
   */
  static parseRoute(route) {
    if (!route) return { pid: 'oa', routePath: '', isSystemRoute: false, isCrossProjectApi: false };
    
    // 标准化路由
    const routePath = route.trim();
    
    // 结果对象
    const result = {
      pid: 'oa', // 默认为OA项目
      routePath, // 原始路由
      isSystemRoute: false, // 是否系统路由
      isCrossProjectApi: false // 是否跨项目API
    };
    
    // 识别模式一：[项目]_api/[功能] - 跨项目API调用
    if (routePath.match(/^[a-z]+_api\//i)) {
      const parts = routePath.split('_api/');
      if (parts.length >= 2) {
        result.pid = parts[0].toLowerCase();
        result.routePath = parts[1];
        result.isCrossProjectApi = true;
        return result;
      }
    }
    
    // 识别模式二：system/[功能] - 系统级API
    if (routePath.startsWith('system/')) {
      result.isSystemRoute = true;
      result.pid = 'system';
      return result;
    }
    
    // 特殊路由识别 - PLM项目相关
    if (
      routePath.startsWith('project/') || 
      routePath.startsWith('research/') || 
      routePath.startsWith('task/') || 
      routePath.startsWith('feedback/') || 
      routePath.startsWith('file/')
    ) {
      result.pid = 'plm';
      return result;
    }
    
    return result;
  }
  
  /**
   * 获取路由对应的项目标识
   * @param {String} route 路由字符串
   * @returns {String} 项目标识
   */
  static getProjectId(route) {
    return this.parseRoute(route).pid;
  }
  
  /**
   * 判断是否为跨项目API调用
   * @param {String} route 路由字符串
   * @returns {Boolean} 是否为跨项目API
   */
  static isCrossProjectApi(route) {
    return this.parseRoute(route).isCrossProjectApi;
  }
  
  /**
   * 判断是否为系统路由
   * @param {String} route 路由字符串
   * @returns {Boolean} 是否为系统路由
   */
  static isSystemRoute(route) {
    return this.parseRoute(route).isSystemRoute;
  }
  
  /**
   * 获取处理路由的控制器路径
   * @param {String} route 路由字符串
   * @param {Object} routes 路由配置对象
   * @returns {Object} {controller, action} 控制器和方法
   */
  static getController(route, routes) {
    const { pid, routePath, isSystemRoute, isCrossProjectApi } = this.parseRoute(route);
    
    // 获取路由配置
    let routeConfig = null;
    
    if (isCrossProjectApi) {
      // 对于跨项目API调用，尝试在routePath中查找匹配
      routeConfig = routes[routePath];
    } else {
      // 常规路由查找
      routeConfig = routes[route];
    }
    
    if (!routeConfig) {
      console.error(`[RouteHelper] 未找到路由配置: ${route}`);
      throw new AppError('无效的API路由', 404);
    }
    
    // 解析控制器和方法
    const parts = routeConfig.split('@');
    if (parts.length !== 2) {
      console.error(`[RouteHelper] 无效的路由配置格式: ${routeConfig}`);
      throw new AppError('路由配置格式错误', 500);
    }
    
    return {
      controller: parts[0],
      action: parts[1]
    };
  }
  
  /**
   * 创建跨项目请求上下文
   * @param {String} route 路由字符串
   * @param {Object} event 请求事件
   * @returns {Object} 跨项目上下文
   */
  static createCrossContext(route, event) {
    const { pid, isCrossProjectApi } = this.parseRoute(route);
    
    return {
      pid,
      isCrossProjectApi,
      sourceProject: event.sourceProject || 'unknown',
      authResult: event._authResult || null,
      timestamp: Date.now()
    };
  }
}

module.exports = RouteHelper; 